/* ****路由**** */
const fs = require('fs');
const path = require('path');
const {
    handle
} = require('./handler');

function route(handler, req, res, pathname, qstr) {

    switch (pathname) {
        case "/":
            //访问首页
            handler.home(req, res, qstr)
            break;
        case "/index":
            handler.home(req, res, qstr)
            break;
        case "/favicon.png":
            req.url = "/img/titleicon.icon";
            handleAsFile(req, res, req.url);
            break;

        case "/details.html":
            //把传过来的商品id放进cookie
            res.setHeader('Set-Cookie', `${qstr}`);
            //返回详情页模板页面detail.html
            handleAsFile(req, res, pathname);
            break;
        case "/getSKU":
            res.statusCode = 200;
            res.end(`这里返回相应商品${qstr}的信息`);
            break;

        case "/cartInfo":
            //todo:补全代码，只有登录了的用户，才能送信息进来保存
            //在这里，客户端送购物车信息到服务器保存。
            cart = JSON.parse(qstr);
            console.log(cart);
            //返回,不然客户端等不到返回信息，出错。
            res.statusCode = 200;
            res.end("已收到购物车信息");
            break;
        case "/cart":
            var string = fs.readFileSync('../website/cart.html', 'utf8');
            res.setHeader('Content-Type', 'text/html; charset=utf-8');
            res.write(string);
            res.end();
            break;
        case "/reg":
            console.log('reg请求方式：' + req.method);
            if (req.method === "POST") {
                handler.reg(req, res, qstr)
            } else {
                var string = fs.readFileSync('../website/reg.html', 'utf8');
                res.setHeader('Content-Type', 'text/html; charset=utf-8');
                res.write(string);
                res.end();
            }

            break;
        case "/login":
            console.log('login请求方式：' + req.method);
            if (req.method === "POST") {
                handler.login(req, res, qstr)
            } else {
                var string = fs.readFileSync('../website/login.html', 'utf8');
                res.setHeader('Content-Type', 'text/html; charset=utf-8');
                res.write(string);
                res.end();
            }

            break;
        case "/logout":
            handler.logout(req, res)

            break;
        case "/about":
            var string = fs.readFileSync('../website/about.html', 'utf8');
            res.setHeader('Content-Type', 'text/html; charset=utf-8');
            res.write(string);
            res.end();
            break
        default:
            handleAsFile(req, res, pathname);
            break;
    }

    // 根据后缀名返回文件类型
    function handleAsFile(req, res, pathname) {
        let f = __dirname + '/../website' + pathname;
        fs.stat(f, (err, stat) => {
            if (err) {
                console.log(err);
                pipe404(res);
            } else {
                if (stat.isFile()) {
                    setContentType(req, res);
                    fs.createReadStream(f).pipe(res);
                } else {
                    pipe404(res);
                }
            }
        });


    }
    //根据请求的后缀名，返回文件的类型
    function getContentType(req) {
        //建一个类，key-value,key是扩展名，值是content-type. 参考：https://tool.oschina.net/commons
        const extTypes = {
            ".html": "text/html",
            ".js": 'application/x-javascript',
            ".json": 'application/json', //https://tool.oschina.net/commons竟然没有这一项，我自己加上去的
            ".*": 'application/octet-stream', //对应没有扩展名的文件
            ".css": "text/css",
            ".png": "image/png",
            ".jpg": "application/x-jpg",
            ".jpeg": "image/jpeg",
            ".gif": "image/gif"
            //各种图片，js等。完整的话，应该把整个放进来。
        }

        //试试通过req.url取扩展名:path.extName(req.url);
        let ext = path.extname(req.url);
        if (ext == '') ext = ".*";
        let type = extTypes[ext];

        if (!type) {
            // console.log(ext, "扩展名对应的数据类型未查到！");
            type = 'application/octet-stream';
        }
        return type;
    }

    function setContentType(req, res) {
        res.setHeader('Content-Type', getContentType(req));
    }

    function pipe404(res) {
        res.statusCode = 404;
        res.setHeader('Content-Type', 'text/html;charset=UTF-8');
        res.end("<h1 style='color:red;'>404:请求内容不存在或服务暂不支持！</h1>");
    }

}
module.exports = {
    route
}